Capítulo 7 · Do Endereço ao Mapa — Geocodificação com Geopy
Aprenda a transformar endereços em coordenadas, automatizar buscas em lote e preparar bases espaciais prontas para análise ou visualização.
Você vai aprender a
- ▹Explicar o conceito de geocodificação e suas aplicações no geoprocessamento.
- ▹Configurar o Geopy para consumir provedores confiáveis, como o ArcGIS.
- ▹Geocodificar endereços individuais ou em lote e gerar planilhas com coordenadas.
1. O que é geocodificação? Transformando texto em localização
Endereços como "Avenida Mauro Ramos, 950" ou "Praça XV de Novembro" são intuitivos para nós, mas computadores trabalham melhor com números. A geocodificação converte descrições textuais em pares de coordenadas (latitude e longitude), permitindo que sistemas GIS posicionem um pino no mapa.
O processo inverso recebe o nome de geocodificação reversa: dado um par de coordenadas, obtemos o endereço correspondente. Ambas as direções sustentam análises espaciais modernas e integram planilhas a mapas.
Por que isso é crucial no geoprocessamento?
- Enriquecimento de dados: planilhas com endereços passam a conter coordenadas, desbloqueando análises espaciais.
- Análises avançadas: cálculos de distância, identificação de clusters e criação de mapas de calor dependem de pontos georreferenciados.
- Aplicações modernas: logística, transporte e marketing baseiam-se em geocodificação para localizar clientes, criar rotas e definir áreas de influência.
2. Como funciona? APIs e a biblioteca Geopy
Construir um geocodificador do zero exigiria um banco global de endereços — tarefa reservada às grandes empresas. Felizmente, APIs prontas (Google, Here, TomTom, Esri) disponibilizam infraestrutura robusta mediante requisições HTTP.
A biblioteca Geopy atua como um tradutor universal. Você usa métodos padronizados como .geocode(), e ela cuida de adaptar a chamada para o serviço escolhido. Trocar de provedor costuma ser tan-to simples quanto alterar uma linha de código.
Dica do professor
Para projetos acadêmicos, o provedor ArcGIS equilibra qualidade e facilidade: não exige chave de API para uso básico e aceita um volume moderado de requisições.
Curiosidade: limites de uso
Serviços como o Nominatim, baseado no OpenStreetMap, limitam o ritmo de requisições (tipicamente 1 por segundo) para evitar sobrecarga. Respeitar limites é parte da boa cidadania digital.
3. Mãos à obra: geocodificando seu primeiro endereço
Vamos localizar o IFSC Florianópolis com o provedor ArcGIS. Instale o Geopy no ambiente virtual do projeto:
pip install geopy
O script abaixo organiza o fluxo em quatro etapas: importar, instanciar, geocodificar e validar o retorno.
# 1. Importar a classe do provedor escolhido
from geopy.geocoders import ArcGIS
# 2. Criar o geocodificador (nosso "controle remoto")
geolocator = ArcGIS()
# 3. Enviar o endereço para a API
endereco = "IFSC Florianópolis, Avenida Mauro Ramos, 950, Centro, Florianópolis, SC"
print(f"Buscando as coordenadas para: '{endereco}'")
try:
location = geolocator.geocode(endereco, timeout=10)
# 4. Conferir se o resultado é válido
if location:
print(f"\nEndereço completo encontrado: {location.address}")
print(f"Latitude: {location.latitude}")
print(f"Longitude: {location.longitude}")
print(f"Coordenadas: ({location.latitude}, {location.longitude})")
# print(f"Dados brutos: {location.raw}")
else:
print("\nEndereço não encontrado ou ambíguo. Tente detalhar mais.")
except Exception as e:
print(f"\nOcorreu um erro durante a geocodificação: {e}")
Atenção aos resultados
Se location for None, o endereço não foi encontrado. Sempre valide antes de acessar location.latitude para evitar erros AttributeError.
4. Laboratório prático: geocodificando uma lista de escolas
Agora, aplicamos o conceito em lote. Se você já tem o arquivo arquivos/NEIM.txt da rede municipal de Florianópolis (disponível neste material), basta reutilizá-lo para gerar a lista simplificada de endereços. Utilize o botão abaixo para baixar o arquivo original direto para o seu computador.
Arquivo de referência
Coleção completa dos NEIMs de Florianópolis com nome, endereço, CEP, contato e direção.
O fragmento abaixo cria automaticamente um enderecos.txt com apenas o nome da unidade e o endereço completo separados por ponto e vírgula.
import pandas as pd
from pathlib import Path
fonte = Path('arquivos/NEIM.txt')
destino = Path('enderecos.txt')
df = pd.read_csv(fonte, sep=';', encoding='utf-8')
df[['Nome', 'Endereço']].to_csv(destino, sep=';', index=False, header=False)
print(f"Arquivo '{destino}' criado com {len(df)} endereços.")
Se preferir manter tudo em um único arquivo, também é possível adaptar o script principal para ler diretamente o NEIM.txt; a versão abaixo mostra a abordagem com o arquivo reduzido enderecos.txt, ideal para focar nos campos essenciais.
Com o arquivo de endereços pronto, confirme que cada linha possui o formato nome;endereço:
NEIM Abraão;Rua João Meirelles, n° 1780 - Abraão, Florianópolis
NEIM Anjo da Guarda;Rua João da Cruz Meira, n° 350 - Trindade, Florianópolis
NEIM Campeche;Servidão Dionísio Rafhael Ignácio, n° 287 - Campeche, Florianópolis
NEIM Coqueiros;Rua Bento Góia, n° 185 - Coqueiros, Florianópolis
NEIM Ingleses I;Rua Três Maria, n° 1040 - Ingleses, Florianópolis
Lugar Inválido;Rua Inexistente, 9999, Bairro Fantasma, Cidade Nenhuma
O script a seguir lê cada linha, chama a API, respeita limites de uso e salva um CSV estruturado:
import pandas as pd
from geopy.geocoders import ArcGIS
import time
# --- 1. Configuração ---
geolocator = ArcGIS()
arquivo_entrada = 'enderecos.txt'
arquivo_saida = 'escolas_geocodificadas.csv'
resultados_geocodificados = []
print(f"Iniciando a geocodificação do arquivo '{arquivo_entrada}'...")
try:
with open(arquivo_entrada, 'r', encoding='utf-8') as f:
for linha in f:
if not linha.strip():
continue
partes = linha.strip().split(';')
if len(partes) != 2:
print(f" - AVISO: Linha mal formatada, pulando: '{linha.strip()}'")
continue
nome_escola, endereco_para_buscar = partes
print(f" - Geocodificando: {nome_escola}...")
try:
location = geolocator.geocode(endereco_para_buscar, timeout=10)
if location:
resultados_geocodificados.append({
'nome_escola': nome_escola,
'endereco_encontrado': location.address,
'latitude': location.latitude,
'longitude': location.longitude
})
else:
print(f" AVISO: Endereço para '{nome_escola}' não encontrado.")
resultados_geocodificados.append({
'nome_escola': nome_escola,
'endereco_encontrado': 'NÃO ENCONTRADO',
'latitude': None,
'longitude': None
})
except Exception as e:
print(f" ERRO ao geocodificar '{nome_escola}': {e}")
time.sleep(1) # Respeito ao rate limit
except FileNotFoundError:
print(f"ERRO CRÍTICO: O arquivo '{arquivo_entrada}' não foi encontrado.")
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")
if resultados_geocodificados:
df_resultados = pd.DataFrame(resultados_geocodificados)
df_resultados.to_csv(arquivo_saida, index=False, encoding='utf-8-sig')
print(f"\nGeocodificação concluída! Resultados salvos em '{arquivo_saida}'.")
else:
print("\nNenhum endereço foi processado.")
O arquivo escolas_geocodificadas.csv gerado contém coordenadas prontas para o QGIS, Folium ou quaisquer análises espaciais subsequentes.
Exercício rápido
- Personalize a lista: inclua três endereços relevantes para seus projetos e avalie a precisão das coordenadas.
- Valide resultados: abra o CSV no QGIS e confirme se os pontos coincidem com os locais esperados.
- Experimente outro provedor: troque
ArcGIS()porNominatim(user_agent="ifsc-geopy")e compare diferenças.
5. Conclusão e próximos passos
Você aprendeu a transformar textos em coordenadas, tratar erros de geocodificação e gerar outputs compatíveis com ferramentas de análise espacial. No próximo capítulo, integraremos esses dados a mapas interativos.